package day28.homework;

/**
 * 包子类，表示不同口味的包子
 * 
 * HashMap：哈希表实现，无序
 * LinkedHashMap：保持插入顺序
 * TreeMap：按键的自然顺序或自定义顺序排序
 * 
 * 这个类用于表示包子铺中的包子，包含口味信息
 * 使用枚举类型定义包子的口味，确保类型安全
 * 
 * 多线程相关知识点：
 * 1. 枚举类型：线程安全的单例模式实现方式
 * 2. 不可变对象：Bun对象一旦创建就不能修改，线程安全
 * 3. 值对象：Bun对象只包含数据，不包含可变状态
 */
public class Bun {
    /**
     * 包子口味枚举，定义了两种口味：
     * 1. MEAT - 肉馅
     * 2. VEGETABLE - 蔬菜馅
     * 
     * 枚举类型的特点：
     * 1. 类型安全：只能使用枚举中定义的值
     * 2. 单例模式：每个枚举值都是单例对象
     * 3. 线程安全：枚举类型的实例化过程是线程安全的
     * 4. 序列化支持：枚举类型天然支持序列化
     * 5. toString方法：可以重写toString方法提供友好的显示名称
     */
    public enum Flavor {
        /** 肉馅口味 */
        MEAT("肉馅"), 
        /** 蔬菜馅口味 */
        VEGETABLE("蔬菜馅");
        
        /** 口味名称 */
        private String name;
        
        /**
         * 构造方法，初始化口味名称
         * 枚举的构造方法默认是private的，不能被外部调用
         * 
         * @param name 口味名称
         */
        Flavor(String name) {
            this.name = name;
        }
        
        /**
         * 重写toString方法，返回口味的中文名称
         * 便于在输出中显示友好的名称
         * 
         * @return 口味名称字符串
         */
        @Override
        public String toString() {
            return name;
        }
    }
    
    /** 包子口味属性 */
    private Flavor flavor;
    
    /**
     * 构造方法，创建指定口味的包子
     * Bun对象是不可变对象，一旦创建就不能修改
     * 这种设计确保了线程安全
     * 
     * @param flavor 包子口味
     */
    public Bun(Flavor flavor) {
        this.flavor = flavor;
    }
    
    /**
     * 获取包子口味
     * 由于Bun对象是不可变的，这个方法不需要同步
     * 
     * @return 包子口味枚举值
     */
    public Flavor getFlavor() {
        return flavor;
    }
    
    /**
     * 重写toString方法，返回包子的完整描述
     * 便于在输出中显示友好的名称
     * 
     * @return 包子描述字符串
     */
    @Override
    public String toString() {
        return flavor + "包子";
    }
}